home *** CD-ROM | disk | FTP | other *** search
/ Personal Computer World 2009 February / PCWFEB09.iso / Software / Resources / Chat & Communication / Digsby build 37 / digsby_setup.exe / lib / singleinstance.pyo (.txt) < prev    next >
Python Compiled Bytecode  |  2008-10-13  |  6KB  |  183 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyo (Python 2.5)
  3.  
  4. from __future__ import with_statement
  5. import sys
  6. import socket
  7. import wx
  8. import os
  9. import logging
  10. import threading
  11. from time import time
  12. from traceback import print_exc
  13.  
  14. class SingleInstanceApp(wx.App):
  15.     
  16.     def __init__(self, appname, *args, **kws):
  17.         appname = '%s-%s' % (appname, wx.GetUserId())
  18.         mgr = InstanceChecker(appname, 'localhost', InstanceChecker.default_port)
  19.         self.instance_checker = mgr
  20.         
  21.         try:
  22.             if mgr.isAnotherRunning() and mgr.sendRaisePreviousFrameCommand():
  23.                 print 'instance already running. quitting!'
  24.                 sys.exit(0)
  25.         except Exception:
  26.             print_exc()
  27.  
  28.         wx.App.__init__(self, *args, **kws)
  29.  
  30.     
  31.     def StopSingleInstanceServer(self):
  32.         return self.instance_checker.stopServer()
  33.  
  34.     
  35.     def SetTopWindow(self, w):
  36.         wx.App.SetTopWindow(self, w)
  37.         instcheck = self.instance_checker
  38.         instcheck.setFrame(w)
  39.         if not instcheck.isServerRunning():
  40.             instcheck.startServer()
  41.         
  42.  
  43.     
  44.     def MainLoop(self, *args, **kws):
  45.         if not hasattr(self, 'instance_checker'):
  46.             raise AssertionError('must call SetTopWindow on this app first')
  47.         
  48.         
  49.         try:
  50.             wx.App.MainLoop(self, *args, **kws)
  51.         finally:
  52.             self.instance_checker.stopServer()
  53.  
  54.  
  55.  
  56.  
  57. class ServerThread(threading.Thread):
  58.     backlog = 5
  59.     
  60.     def __init__(self, host, port, function, timeout = None):
  61.         threading.Thread.__init__(self, name = self.__class__.__name__ + '-' + host + ':' + str(port))
  62.         self.host = host
  63.         self.port = port
  64.         self.function = function
  65.         self.die = False
  66.         if not timeout:
  67.             pass
  68.         self.timeout = 0.2
  69.  
  70.     
  71.     def run(self):
  72.         s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  73.         s.bind((self.host, self.port))
  74.         s.listen(self.backlog)
  75.         s.settimeout(self.timeout)
  76.         while not self.die:
  77.             
  78.             try:
  79.                 (client, address) = s.accept()
  80.                 self.function()
  81.                 client.close()
  82.             continue
  83.             except socket.timeout:
  84.                 e = None
  85.                 continue
  86.             
  87.  
  88.             None<EXCEPTION MATCH>socket.timeout
  89.         s.close()
  90.  
  91.     
  92.     def isRunning(self):
  93.         return not (self.die)
  94.  
  95.     
  96.     def stop(self):
  97.         self.die = True
  98.  
  99.  
  100.  
  101. def poke_client_port(host, port):
  102.     
  103.     try:
  104.         s = socket._orgsocket(socket.AF_INET, socket.SOCK_STREAM)
  105.         s.connect((host, port))
  106.         s.close()
  107.     except Exception:
  108.         return False
  109.  
  110.     return True
  111.  
  112.  
  113. class InstanceChecker(object):
  114.     default_port = 8791
  115.     
  116.     def __init__(self, name, host, port, frame = None, func = None):
  117.         self.name = name
  118.         self.frame = frame
  119.         self.port = port
  120.         self.host = host
  121.         self.logger = logging.getLogger('')
  122.         if not func:
  123.             
  124.             self.func = lambda : wx.CallAfter(self._InstanceChecker__raiseFrame)
  125.         
  126.         self.s_checker = wx.SingleInstanceChecker(self.name)
  127.  
  128.     
  129.     def startServer(self):
  130.         self.logger.info('Server stuff')
  131.         self.server = ServerThread(self.host, self.port, self.func)
  132.         self.server.start()
  133.  
  134.     
  135.     def sendRaisePreviousFrameCommand(self):
  136.         self.logger.info('Poking IPC loopback connection')
  137.         return poke_client_port(self.host, self.port)
  138.  
  139.     
  140.     def isServerRunning(self):
  141.         if hasattr(self, 'server'):
  142.             pass
  143.         return self.server.isRunning()
  144.  
  145.     
  146.     def stopServer(self):
  147.         if hasattr(self, 's_checker'):
  148.             del self.s_checker
  149.         
  150.         if self.server.isRunning():
  151.             self.server.stop()
  152.             return True
  153.         else:
  154.             self.logger.warning("Tried to stop a server that wasn't running")
  155.             return False
  156.  
  157.     
  158.     def setFrame(self, f):
  159.         self.frame = f
  160.  
  161.     
  162.     def setFunc(self, func):
  163.         self.func = func
  164.  
  165.     
  166.     def __raiseFrame(self):
  167.         self.frame.Show(True)
  168.         self.frame.Iconize(False)
  169.         self.frame.Raise()
  170.  
  171.     
  172.     def isAnotherRunning(self):
  173.         return self.s_checker.IsAnotherRunning()
  174.  
  175.  
  176. if __name__ == '__main__':
  177.     app = SingleInstanceApp(0)
  178.     f = wx.Frame(None, -1, 'This app only runs once!')
  179.     f.Show(True)
  180.     app.SetTopWindow(f)
  181.     app.MainLoop()
  182.  
  183.